//
//  HMComposeTextView+Extension.swift
//  VVeibo21
//
//  Created by Apple on 16/11/4.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit

extension HMComposeTextView {
    
    var emoticonText: String {
        var result = ""
        //  遍历富文本
        self.attributedText.enumerateAttributes(in: NSMakeRange(0, self.attributedText.length), options: []) { (info, range, _) in
            // (info, range, _)
            /*
             info: 富文本的描述信息
             range: 富文本的范围
             UnsafeMutablePointer :  遍历是否停止标记
             */
            
            print(info)
            
            if let attachment = info["NSAttachment"] as? HMTextAttachment {
                //  表示是图片表情富文本
                let emoticon = attachment.emoticon!
                
                
                result += emoticon.chs!
                
            } else {
                //  文字富文本
                
                //  根据文字富文本的范围获取对应的范围的富文本
                let textAttributedStr = self.attributedText.attributedSubstring(from: range)
                
                //  根据富文本获取对应的字符串
                let text = textAttributedStr.string
                result += text
                
                //print(NSStringFromRange(range))
                
            }
        }
        
        return result
    
    }
    
    
    //  根据表情模型插入对应的富文本
    func insertEmoticon(emoticon: HMEmoticon) {
    
        if emoticon.type == "0" {
            //  表示图片
            //            textView.insertText(emoticon.chs!)
            
            //  记录上一次的富文本
            let lastAttributedString = NSMutableAttributedString(attributedString: self.attributedText)
            
//            // 根据图片的全路径创建 UIImage 对象
//            let image = UIImage(named: emoticon.fullPath!)
//            // 根据 UIImage 对象创建文本附件(NSTextAttachment)
//            let attachment = HMTextAttachment()
//            //  给文本附件设置显示的图片
//            attachment.image = image
//            //  设置表情模型
//            attachment.emoticon = emoticon
//            //  设置成为文字大小
//            let fontHeight = self.font!.lineHeight
//            //  文本附件bounds大小
//            //  设置 bounds 会相应子控件的显示位置
//            attachment.bounds = CGRect(x: 0, y: -4, width: fontHeight, height: fontHeight)
//            // 根据文本附件创建富文本(NSAttributedString)
//            let attributedStr = NSAttributedString(attachment: attachment)

            //  以上代码已经抽取到NSAttributedString+Extension
            
            
            //  使用NSAttributedString 扩展创建表情富文本
            let attributedStr = NSAttributedString.attributedStringWithEmoticon(emoticon: emoticon, font: self.font!)
            //  拼接富文本
            //lastAttributedString.append(attributedStr)
            
            //  获取选中的富文本
            var selectRange = self.selectedRange
            lastAttributedString.replaceCharacters(in: selectRange, with: attributedStr)
            
            //  设置富文本的字体大小
            lastAttributedString.addAttribute(NSFontAttributeName, value: self.font!, range: NSMakeRange(0, lastAttributedString.length))
            
            // 设置富文本
            self.attributedText = lastAttributedString
            //  设置光标位置
            selectRange.location += 1
            //  设置范围的长度
            selectRange.length = 0
            self.selectedRange = selectRange
            
            //  设置富文本不会发送文字改变的通知和不用掉用文字改变的代理方法
            
            //  自己发送文字改变的通知
            NotificationCenter.default.post(name: NSNotification.Name.UITextViewTextDidChange, object: nil)
            //  自定义使用代理对象调用代理方法
            //  文字改变的代理方法是可选, 为了安全性,可以使用?判断一下这个方式是否实现,如果实现了那么可以直接调用,否则直接 nil
            //  现在这个情况可以强制解包,原因我们已经实现了 '!'\
            //  使用'!'向系统保证我的方法一定实现了
            self.delegate?.textViewDidChange?(self)
            
            
            
        } else {
            //  emoji
            self.insertText((emoticon.code! as NSString).emoji())
        }
    }


}
